package com.example.nettydemo.handle;

import com.alibaba.fastjson.JSONObject;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.channel.SimpleChannelInboundHandler;

import java.nio.charset.StandardCharsets;

/**
 * ChannelInboundHandlerAdapter extends ChannelHandlerAdapter 用于对网络事件进行读写操作
 *
 * @author Administrator
 * @since 2019-07-05 15:54
 */

public class TimeServerStringMessageHandler extends SimpleChannelInboundHandler<String> {
    private StringBuffer stringBuffer = new StringBuffer();

    /**
     * 收到客户端消息，自动触发
     *
     * @param ctx
     * @param msg
     * @throws Exception
     */
    @Override
    public void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
        System.out.println("msg = " + msg);
        stringBuffer.append(msg);
    }

    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        String body = stringBuffer.toString();
        stringBuffer.delete(0, stringBuffer.length());

        if ("".equals(body)){
            System.out.println("body = " + body);
            return;
        }
        //
        // if (!body.endsWith("JSONSENDOVER")) {
        //     ctx.writeAndFlush("{\"type\": \"resend\"}JSONSENDOVER");
        //     System.err.println("channelReadComplete body = " + body);
        //     return;
        // }

        JSONObject jsonObject = JSONObject.parseObject(body.replace("JSONSENDOVER", ""));
        String type = jsonObject.getString("type");
        System.out.println("jsonObject.toJSONString() = " + jsonObject.toJSONString());

        switch (type) {
            case "heartbeat":
                ctx.writeAndFlush("{\"type\": \"heartbeat\"}JSONSENDOVER");
                break;
            case "service":
                /**回复消息
                 * copiedBuffer：创建一个新的缓冲区，内容为里面的参数
                 * 通过 ChannelHandlerContext 的 write 方法将消息异步发送给客户端
                 * */
                String respMsg = "{\"type\": \"service\"}JSONSENDOVER";
                ctx.write(jsonObject.toJSONString());
                ctx.write("JSONSENDOVER");
                ctx.flush();
                break;
            default:
        }
        /**flush：将消息发送队列中的消息写入到 SocketChannel 中发送给对方，为了频繁的唤醒 Selector 进行消息发送
         * Netty 的 write 方法并不直接将消息写如 SocketChannel 中，调用 write 只是把待发送的消息放到发送缓存数组中，再通过调用 flush
         * 方法，将发送缓冲区的消息全部写入到 SocketChannel 中
         * */
        // Thread.sleep(10000);
        // ctx.flush();
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        /**当发生异常时，关闭 ChannelHandlerContext，释放和它相关联的句柄等资源 */
        System.out.println("exceptionCaught = " + cause);
        ctx.close();
    }
}
